﻿using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using PaklenaBasta.Api.Models;
using PaklenaBasta.Api.Repositories;

var builder = WebApplication.CreateBuilder(args);

var jwtKey = builder.Configuration["Jwt:Key"] ?? "VerySecretKeyForDemo_ChangeMe";
var issuer = builder.Configuration["Jwt:Issuer"] ?? "PaklenaBasta";

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = false,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = issuer,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey))
    };
});

builder.Services.AddAuthorization();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthentication();
app.UseAuthorization();

app.MapPost("/api/login", (LoginRequest req) =>
{
    // Demo validation - replace with real user store
    if (req.Email == "user@demo.com" && req.Password == "Pass123!")
    {
        var claims = new[] { new Claim(ClaimTypes.Name, req.Email) };
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
        var token = new JwtSecurityToken(
            issuer: issuer,
            audience: null,
            claims: claims,
            expires: DateTime.UtcNow.AddHours(8),
            signingCredentials: creds);

        return Results.Json(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
    }

    return Results.Unauthorized();
}).AllowAnonymous();

app.MapGet("/api/filmovi", () => Results.Json(FilmRepository.GetAll())).RequireAuthorization();

app.MapGet("/api/stream/{id}", (string id) =>
{
    var film = FilmRepository.GetById(id);
    if (film is null) return Results.NotFound();
    return Results.Json(new { streamUrl = film.StreamUrl });
}).RequireAuthorization();

app.MapPost("/api/filmovi", (Film film) =>
{
    if (string.IsNullOrWhiteSpace(film.Id)) film.Id = Guid.NewGuid().ToString();
    FilmRepository.Add(film);
    return Results.Created($"/api/filmovi/{film.Id}", film);
}).RequireAuthorization();

app.Run();

public record LoginRequest(string Email, string Password);
